package org.ciallo.simplemusicplayer.viewmodel;

import android.app.Application;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import org.ciallo.simplemusicplayer.controller.PlayerController;
import org.ciallo.simplemusicplayer.data.model.Song;
import org.ciallo.simplemusicplayer.service.MediaPlayerService;
import timber.log.Timber;

import java.util.List;

/**
 * @author Jukomu
 * @Description: 共享的 ViewModel，用于持有 PlayerController 实例，
 * 并向上层UI组件暴露播放状态和播放控制方法。
 * @Package: org.ciallo.simplemusicplayer.viewmodel
 * @Project: SimpleMusicPlayer
 * @name: SharedViewModel
 * @Date: 2025/5/29-03:08
 * @Filename: SharedViewModel
 */
public class SharedViewModel extends AndroidViewModel {

    private final PlayerController playerController; // 持有 PlayerController 的唯一实例

    /**
     * 直接暴露 MediaPlayerService 中的静态 LiveData<PlaybackInfo>。
     * UI 组件将直接观察这个 LiveData 来更新自身。
     */
    public final LiveData<MediaPlayerService.PlaybackInfo> playbackInfo;

    // 用于搜索查询
    private final MutableLiveData<String> _currentSearchQuery = new MutableLiveData<>();

    /**
     * LiveData 暴露当前的搜索查询词。
     * UI组件可以观察此 LiveData 来响应搜索词的变化。
     * 设置为空字符串或null表示清除搜索。
     */
    public final LiveData<String> currentSearchQuery = _currentSearchQuery;

    /**
     * SharedViewModel 的构造函数。
     *
     * @param application Application 实例，用于初始化 PlayerController。
     */
    public SharedViewModel(@NonNull Application application) {
        super(application);
        // 创建 PlayerController 的实例，传递 ApplicationContext
        playerController = new PlayerController(application);
        // 直接引用 Service 中的静态 LiveData
        playbackInfo = MediaPlayerService.playbackInfo;
        _currentSearchQuery.setValue(""); // 初始为空搜索词
    }

    // --- 封装 PlayerController 的方法，提供给UI组件调用 ---

    /**
     * 请求播放指定索引的歌曲，并设置新的播放列表。
     *
     * @param playQueue  要设置的新播放列表。
     * @param startIndex 要开始播放的歌曲在列表中的索引。
     */
    public void playSongAtIndex(List<Song> playQueue, int startIndex) {
        playerController.playSongAtIndex(playQueue, startIndex);
    }

    /**
     * 请求播放一首新歌。
     *
     * @param song 要播放的歌曲对象。
     */
    public void playNewSong(Song song) {
        playerController.playNewSong(song);
    }

    /**
     * 请求切换播放/暂停状态。
     */
    public void togglePlayPause() {
        playerController.togglePlayPause();
    }

    /**
     * 请求播放下一首歌曲。
     */
    public void playNext() {
        playerController.playNext();
    }

    /**
     * 请求播放上一首歌曲。
     */
    public void playPrevious() {
        playerController.playPrevious();
    }

    /**
     * 请求跳转到歌曲的指定播放位置。
     *
     * @param position 目标播放位置 (毫秒)。
     */
    public void seekTo(long position) {
        playerController.seekTo(position);
    }

    /**
     * 设置播放模式。
     *
     * @param playMode 要设置的播放模式。
     */
    public void setPlayMode(int playMode) {
        playerController.setPlayMode(playMode);
    }

    /**
     * 循环切换到下一个播放模式。
     */
    public void cyclePlayMode() {
        playerController.cyclePlayMode();
    }

    /**
     * 从当前播放队列中移除指定的歌曲。
     *
     * @param songId 要移除的歌曲的ID。
     */
    public void removeSongFromQueue(long songId) {
        playerController.removeSongFromQueue(songId);
    }

    /**
     * 清空当前播放队列。
     */
    public void clearQueue() {
        playerController.clearQueue();
    }

    /**
     * 请求播放当前队列中具有指定ID的歌曲。
     *
     * @param songId 要播放的歌曲的ID。
     */
    public void playSongByIdInCurrentQueue(long songId) {
        playerController.playSongByIdInCurrentQueue(songId);
    }

    /**
     * 获取底层的 PlayerController 实例。
     * 建议优先使用 SharedViewModel 封装的方法。
     *
     * @return PlayerController 实例。
     */
    public PlayerController getPlayerController() {
        return playerController;
    }


    /**
     * 当此 ViewModel 不再使用并即将被销毁时调用。
     * 在这里释放 PlayerController 持有的资源（如解绑服务）。
     */
    @Override
    protected void onCleared() {
        super.onCleared();
        if (playerController != null) {
            playerController.release(); // 确保 Controller 被释放
        }
    }

    /**
     * 请求将指定歌曲插入到当前播放歌曲的下一首位置。
     * @param song 要插入的歌曲。
     */
    public void insertSongAsNext(Song song) {
        playerController.insertSongAsNext(song);
    }

    /**
     * 请求将指定歌曲添加到当前播放队列的末尾。
     * @param song 要添加的歌曲。
     */
    public void addSongToEndOfQueue(Song song) {
        playerController.addSongToEndOfQueue(song);
    }

    /**
     * 请求立即播放指定的歌曲。
     * @param song 要立即播放的歌曲。
     */
    public void playImmediately(Song song) {
        playerController.playImmediately(song);
    }

    // --- 设置搜索查询词的方法 ---
    /**
     * 设置当前的搜索查询词。
     * @param query 新的查询词。如果为null或空字符串，表示清除搜索。
     */
    public void setSearchQuery(@Nullable String query) {
        String newQuery = (query != null) ? query.trim() : "";
        // 只有当查询词与上一次不同时才更新，或当新查询为空但旧查询非空时（清空操作）
        if (!newQuery.equals(_currentSearchQuery.getValue()) || (newQuery.isEmpty() && _currentSearchQuery.getValue() != null && !_currentSearchQuery.getValue().isEmpty())) {
            Timber.d("SharedViewModel: Setting search query to -> '%s'", newQuery);
            _currentSearchQuery.setValue(newQuery);
        }
    }
}
